package com.zijidelu.luframework.infrastructure.persistence.repository.core.bizsig;

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.zijidelu.luframework.base.bizsig.BizSignatureConditionBuilder;
import com.zijidelu.luframework.base.model.DataModel;
import com.zijidelu.luframework.base.model.PO;

import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;

/**
 * 业务签名数据处理器接口。
 *
 * @author ZIJIDELU
 * @datetime 2024/11/22 16:14
 */
public interface BizSigDataProcessor<P extends PO, D extends DataModel> {

    /**
     * 获取业务签名数据Map
     * <p>
     * 根据集合内的DTO的业务签名，获取数据
     *
     * @param queryConsumer 获取数据条件消费者
     * @return 业务签名数据Map
     */
    Map<String, D> findBatchByQuery(Consumer<QueryChainWrapper<P>> queryConsumer);

    /**
     * 获取业务签名数据Map
     * <p>
     * 根据集合内的DTO的业务签名，获取数据
     *
     * @param queryConsumer 获取数据条件消费者
     * @return 业务签名数据Map
     */
    Map<String, D> findBatchByLambdaQuery(Consumer<LambdaQueryChainWrapper<P>> queryConsumer);

    /**
     * 获取业务签名数据Map
     *
     * @param dataColl dto集合
     * @return 业务签名数据Map
     */
    Map<String, D> findBatch(Collection<D> dataColl);

    /**
     * 获取业务签名数据Map
     * <p>
     * 根据集合内的DTO的业务签名，获取数据
     *
     * @param dataColl      dto集合
     * @param queryConsumer 查询条件消费者
     * @return 业务签名数据Map
     */
    Map<String, D> findBatch(Collection<D> dataColl, Consumer<QueryChainWrapper<P>> queryConsumer);

    /**
     * 获取业务签名数据Map
     * <p>
     * 业务签名字段名称->业务签名字段值值列表
     *
     * @param bizSignatureConditionBuilder 业务签名字段构建器
     * @return 业务签名数据Map
     */
    Map<String, D> findBatchByBuilder(BizSignatureConditionBuilder<D> bizSignatureConditionBuilder);

    /**
     * 获取业务签名数据Map
     * <p>
     * 获取的Data只包含业务签名字段的数据
     *
     * @param dataColl data集合
     * @return 业务签名数据Map
     */
    Map<String, D> findBatchOnlyBizSignature(Collection<D> dataColl);

    /**
     * 根据唯一键判断是否存在。
     *
     * @param data 数据
     * @return 结果
     */
    boolean exists(D data);

    /**
     * 根据唯一键查询。
     *
     * @param data 数据
     * @return 数据记录
     */
    D findOne(D data);

    /**
     * 根据唯一键查询。
     *
     * @param data            数据
     * @param wrapperConsumer 查询条件消费者
     * @return 数据记录
     */
    D findOne(D data, Consumer<LambdaQueryChainWrapper<P>> wrapperConsumer);

    /**
     * 根据唯一键插入。
     *
     * @param data 数据
     * @return 结果
     */
    boolean saveOne(D data);

    /**
     * 根据唯一键批量插入DTO
     *
     * @param dataColl 数据集合
     * @return 结果
     */
    boolean saveBatch(Collection<D> dataColl);

    /**
     * 根据唯一键更新。
     *
     * @param data 数据
     * @return 结果
     */
    boolean updateOne(D data);

    /**
     * 根据唯一键批量更新
     *
     * @param dataColl 数据集合
     * @return 结果
     */
    boolean updateBatch(Collection<D> dataColl);

    /**
     * 根据唯一键删除。
     *
     * @param data 数据
     * @return 结果
     */
    boolean deleteOne(D data);

    /**
     * 批量根据唯一键删除
     *
     * @param dataColl 数据集合
     * @return 结果
     */
    boolean deleteBatch(Collection<D> dataColl);

    /**
     * 根据唯一键批量插入或更新
     *
     * @param dataColl 数据集合
     * @return 结果
     */
    boolean saveOrUpdateBatch(Collection<D> dataColl);

}
